Возможности и ограничения

В двух словах, можно составлять 1 мкс программы по своему усмотрению. Энкодеры в любых вариациях, ШД всё подвластно и не ограничено пресловутой 1 миллисекундой основного цикла. Да, длительность цикла программы будет 1 микросекунда, т.е. в 1000 раз быстрее “основного цикла”.

В процессоре AM1808 два PRU ядра, которые работают на высокой частоте и имеют прямой доступ к некоторым входам-выходам.

Сопроцессоры (PRU) работают на частоте 200 МГц, почти все команды выполняют за 1 такт, и, что хорошо, они не отвлекаются на лишние задачи.

Разумеется, в 1 такт всю программу не уложишь, но за 200 тактов можно многое сделать, т.е. “длительность цикла” порядка 1 мкс достигается без проблем.

Предел размера программы – 1024 команды. Если учесть, что “быстрых” входов выходов не более 4 штук, то и этих 1024 команд вполне хватит для широкого спектра задач. Из команд доступна простая арифметика в 32 bit int (без умножения/деления), условные переходы.

Например, если нужно “отключить мотор по достижению нужного количества импульсов энкодера”, то можно в “1 мкс быстрой программе обсчитывать энкодер и управлять выходом”.

Hardella vs CoDeSys

Этот раздел можно смело пропускать. А можно и не пропускать.

CoDeSys не поддерживает создание PRU программ, поэтому “PRU программа” составляется в среде Hardella. В конце концов, конечно, всем всё равно должен управлять “основной цикл ПЛК”, который управляется из CoDeSys.

Работает это следующим образом:

  1. PRU программа пишется на ST языке
  2. Hardella компилирует PRU ST в машинный код
  3. Скомпилированный код преобразуется в массив байт на ST языке и уже это передаётся в CoDeSys виде .exp файла
  4. “Основной цикл” заливает PRU программу при работе ПЛК, и всё начинает работать

Характеристики ПЛК110 М02

Работа PRU программ проверялась на ОВЕН ПЛК110 М02.

  • Частота PRU: 200 МГц (команды выполняются за 5 нс)
  • Количество PRU: 2 шт. PRU0 и PRU1
  • Быстрые входы 1, 2, 3 и 4 заведены на PRU0
  • Быстрые выходы 1 и 2 управляются от PRU1
  • Быстрые выходы 3 и 4 управляются от PRU0
  • Максимальная длина PRU программы: 1024 команды (ассемблерных)
  • Объём регистровой памяти: около 30 DWORD регистров (около 120 байт)

Варианты использования

По умолчанию, быстрые входы-выходы настраиваются в CoDeSys в разделе PLC Configuration, но есть возможность перевести PRU в свободно программируемый режим, что нам и нужно.

Из-за ограничений прошивки ПЛК110, доступны следующие варианты:

PRU0 PRU1 Комментарий
PLC Configuration PLC Configuration Обычный режим
Свободная программа PLC Configuration Свободная программа в PRU0
Свободная программа Свободная программа Две программы одновременно

Язык программирования

Программы пишутся на языке ST, с некоторыми ограничениями:

  • Не поддерживаются сложные выражения. Т.е. чтобы записать d := a+b-c нужно делать промежуточную переменную и записывать как u := b-c; d:= a+b;. При этом не стоит думать, что “использование одной временной переменной” сократит используемые ресурсы. Если использовать разные переменные, то компилятор сможет понять, когда одна из них становится ненужной.
  • В условных операторах (IF, WHILE, REPEAT) составные AND, OR работают, но тоже не в любых комбинациях. Если скомпилировалось, то норм. Если “не поддерживается”, то будет ошибка компиляции.
  • Не поддерживаются функции
  • Не поддерживаются структуры
  • Не поддерживаются массивы
  • Пока только unsigned типы: BOOL, BYTE, WORD, DWORD и ENUM
  • Все переменные размещаются в регистрах PRU. Поэтому при большом количестве переменных может не хватить регистровой памяти. Тем не менее, промежуточные вычисления могут переиспользовать один и тот же регистр, т.е. ограничение не на общее количество, а на количество “одновременно нужных” переменных

Особенности:

  • Доступа к “текущему времени” нет, но есть счётчик выполненных тактов процессора. 1 такт == 5 нс.
  • В программах можно использовать ассемблерные вставки.

Принцип выполнения программ

Каждое PRU ядро работает по классическому алгоритму “цикла постоянной длительности”.

WHILE TRUE DO
  Выполнение_пользовательского_кода(); (* <-- это и есть прикладной код *)
  
  REPEAT 
     Обмен_данными_с_основной_программой();
     Опрос_входов();
  UNTIL время_следующего_цикла не настало 
  END_REPEAT;
  
  Запись_выходов();
  Опрос_входов(); (* на всякий пожарный *)
END_WHILE;

Длительность цикла выбирается при составлении программы и указывается в PRU Configuration. Как и в обычном ПЛК-программировании, цикл WHILE TRUE в прикладном коде не нужен, его добавит среда. Нужно лишь написать программу (PROGRAM), и обозначить на каком PRU ядре она должна выполняться.

Принцип PRU программирования совпадает с принципом обычного ПЛК программирования. Отличие в том, что у PRU “длительность цикла” может составлять микросекунды.

Обновлено:

Комментировать